/*
 * ArchivoBinario.h
 *
 *  Created on: 25/10/2009
 *      Author: hernan
 */

#ifndef ARCHIVOBINARIO_H_
#define ARCHIVOBINARIO_H_

#include "Almacenamiento.h"
#include <fstream>
#include <string>
#include "Archivo.h"


/******************************************************************************/
/* Definiciones de Tipos de Datos */
/*--------------------------------*/

struct ArchivoRegistros
{
	 std::fstream  archivo;  // referencia al archivo
	 int tamanioRegistro;    // tamanio en bytes del registro
};


class ArchivoBinario: public Archivo {

	private: ArchivoRegistros ptrarchivo;

	public:  ArchivoBinario();

	public:  ArchivoBinario(const string& nombre,int tamanioRegistro);

	public:virtual ~ArchivoBinario();

/******************************************************************************/
/* Definicion de Primitivas */
/*--------------------------*/

/*
  pre : ninguna.
  post: abre el archivo, si no existe lo crea.

  archivoRegistros : estructura de datos a ser creada.
  nombre : nombre fisico del archivo, path incluido.
  tamanioRegistro : tamanio en bytes de los registros del archivo.
*/
	public: virtual void create(const string& nombre,int tamanioRegistro);

/*----------------------------------------------------------------------------*/
/*
  pre : archivoRegistros ha sido creado con crear().
  post: cierra el archivo

  archivoRegistros : archivo sobre el cual se aplica la primitiva.
*/
	public: virtual void clean();

/*----------------------------------------------------------------------------*/
/*
  pre : archivoRegistros ha sido creado con crear() y registro es un puntero
        a un struct del tamanioo correspondiente al de los registros del archivo.
  post: escribe el registro en el archivo en la posicion actual.

  archivoRegistros : archivo sobre el cual se aplica la primitiva.
  registro : puntero hacia el registro a ser escrito en el archivo.


*/
	public: virtual int Write(string& registro);

/*----------------------------------------------------------------------------*/
/*
  pre : archivoRegistros ha sido creado con crear() y registro es un puntero
        a un struct del tamanio correspondiente al de los registros del archivo.
  post: lee del archivo el registro en la posicion actual.

  archivoRegistros : archivo sobre el cual se aplica la primitiva.
  registro : puntero hacia el registro donde colocar la lectura.
*/
	public: virtual string Read(int pos);

/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/*
  pre : archivoRegistros ha sido creado con crear().
  post: devuelve true si se ha llegado al fin del archivo, es decir no se puede
        leer mas registros. false en caso contrario.

  archivoRegistros : archivo sobre el cual se aplica la primitiva.
*/
	private: bool fin();

/*----------------------------------------------------------------------------*/
/*
  pre : archivoRegistros ha sido creado con crear().
  post: devuelve la posicion relativa del registro actual.

  archivoRegistros : archivo sobre el cual se aplica la primitiva.
*/
	public: long int posicion();

/*----------------------------------------------------------------------------*/
/*
  pre : archivoRegistros ha sido creado con crear().
  post: cambia la posicion actual.

  archivoRegistros : archivo sobre el cual se aplica la primitiva.
  posicion : numero de registro (0..n)
*/
	public: virtual void SetPosicion(long int posicion);

/*------------------------------------------------------------------------------*/

	/**
	 * Metodo que salva en  disco y devuelve en que lugar de dicha
 	 * estructura se guardo la informacion
 	 */


	public: virtual int saveData(string data, int posicion);

	public: virtual void updateData(int position,string data);

	public: virtual string getData(int position);

	public: virtual int getOldData();

/******************************************************************************/
};

#endif /* ARCHIVOBINARIO_H_ */
